package co.com.javeriana.aes.patrones.dao;

import java.util.ArrayList;
import java.util.List;
import java.sql.*;

import co.com.javeriana.aes.patrones.interfaz.IOperacionesDAO;
import co.com.javeriana.aes.patrones.saiii.dto.*;

public class DAO implements IOperacionesDAO {

	private String sentencia;

	private static Connection crearConexion() {

		Connection conexion = null;

		try {
			String driver = "com.mysql.jdbc.Driver";
			String url = "jdbc:mysql://localhost:3306/patrones";
			String username = "patrones";
			String password = "patrones";

			Class.forName(driver);
			conexion = DriverManager.getConnection(url, username, password);
		} catch (Exception e) {
			System.out.print(e.getMessage());
		}

		return conexion;
	}

	public List<Proveedor> consultarProveedores() throws SQLException {

		ResultSet resultado = null;
		Statement comando = null;
		Connection conexion = null;

		List<Proveedor> proveedores = null;

		try {
			proveedores = new ArrayList<Proveedor>();
			conexion = crearConexion();

			comando = conexion.createStatement();
			sentencia = "SELECT id, nombre FROM patrones.proveedor";
			resultado = comando.executeQuery(sentencia);

			while (resultado.next()) {
				int id = resultado.getInt("Id");
				String nombre = resultado.getString("Nombre");
				proveedores.add(new Proveedor(id, nombre));
			}
			;
		} catch (SQLException ex) {
			System.out.print(ex.getMessage());
		} finally {
			if (resultado != null)
				resultado.close();
			if (comando != null)
				comando.close();
			if (conexion != null)
				conexion.close();
		}

		return proveedores;
	}

	public List<Producto> consultarProductos() throws SQLException {
		ResultSet resultado = null;
		Statement comando = null;
		Connection conexion = null;

		List<Producto> productos = null;

		try {
			productos = new ArrayList<Producto>();
			conexion = crearConexion();

			comando = conexion.createStatement();
			sentencia = "SELECT id, nombre FROM patrones.producto";
			resultado = comando.executeQuery(sentencia);

			while (resultado.next()) {
				int id = resultado.getInt("Id");
				String nombre = resultado.getString("Nombre");
				productos.add(new Producto(id, nombre));
			}
			;
		} catch (SQLException ex) {
			System.out.print(ex.getMessage());
		} finally {
			if (resultado != null)
				resultado.close();
			if (comando != null)
				comando.close();
			if (conexion != null)
				conexion.close();
		}

		return productos;
	}

	public List<OrdenCompra> consultarPedidos(OrdenCompra ordenCompra)
			throws SQLException {
		ResultSet resultado = null;
		Statement comando = null;
		Connection conexion = null;

		List<OrdenCompra> ordenes = null;
		OrdenCompra orden = null;

		try {
			ordenes = new ArrayList<OrdenCompra>();
			conexion = crearConexion();

			comando = conexion.createStatement();
			sentencia = "SELECT id, fechaPedido FROM patrones.pedido";
			resultado = comando.executeQuery(sentencia);

			while (resultado.next()) {
				Long id = resultado.getLong("Id");
				Timestamp fechaOrden = resultado.getTimestamp("fechaPedido");
				Date fecha = new Date(fechaOrden.getTime());
				orden = new OrdenCompra(id, fecha);

				ordenes.add(orden);
			}
			;
		} catch (SQLException ex) {
			System.out.print(ex.getMessage());
		} finally {
			if (resultado != null)
				resultado.close();
			if (comando != null)
				comando.close();
			if (conexion != null)
				conexion.close();
		}

		return ordenes;
	}

	public int crearPedido(OrdenCompra ordenCompra) throws SQLException {
		java.sql.CallableStatement comando = null;
		Connection conexion = null;
		int idOrden = 0;

		try {
			conexion = crearConexion();

			comando = conexion
					.prepareCall("{ call patrones.insertar_pedido (?) }");
			Timestamp fecha = new Timestamp(new java.util.Date().getTime());
			comando.setTimestamp("fechaPedido", fecha);
			comando.executeUpdate();

			ResultSet generatedKeys = comando.getResultSet();
			if (null != generatedKeys && generatedKeys.next()) {
				idOrden = generatedKeys.getInt(1);
				System.out.print(idOrden);
			}

			generatedKeys.close();
			if (comando != null)
				comando.close();

			for (Producto producto : ordenCompra.getProductos()) {
				comando = conexion
						.prepareCall("{ call insertar_detallepedido (?,?,?,?,?) }");
				comando.setInt("idPedido", idOrden);
				comando.setInt("idProveedor", producto.getProveedor().getId());
				comando.setInt("idProducto", producto.getId());
				comando.setInt("cantidad", producto.getCantidad());
				comando.setDouble("valor", producto.getValor());
				comando.executeUpdate();
			}

		} catch (Exception ex) {
			System.out.print(ex.getMessage());
		} finally {
			if (comando != null)
				comando.close();
			if (conexion != null)
				conexion.close();
		}
		return idOrden;
	}

}
